/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package basedatos;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import genericos.ComparadorFechas;
import genericos.Grid;
import genericos.Grid2;
import genericos.Grid3;
import java.util.List;
import java.util.ArrayList;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 *
 * @author residentene
 */
public class Seleccion {

    static Pool p = new Pool();

    /**
     * Método que califica los objetivos de dirección.
     *
     * @param dir id de la dirección a calificar
     */
    public static void calobjdir(int dir) {
        int[] tac = idtacticas();
        boolean trcol = false;
        boolean trmm = false;
        boolean trd = false;
        int trim=Seleccion.calculatrimestre();
        int year=new java.util.Date().getYear()+1900;
        //int year=2013;
       // int trim=3;
        int pcol = 0;
        int pmm = 0;
        int pdir = 0;
        int avance = 0;
        for (int i = 0; i < tac.length; i++) {
            int j = tac[i];
            int[] x = idobjdir(j, dir,trim);
            for (int m = 0; m < x.length; m++) {
                int n = x[m];
                trcol = tienerelacion(n,trim,year);
                trmm = tienerelacionmm(n,trim,year);
                trd = tienerelacionD(n,trim,year);
                if (trd == true) {
                    pdir = avanceobjdirD(n,trim,year);
                    if (trmm == false) {
                        avance = pdir;
                        System.out.println("calobjdir: solo director, el avance es de " + avance);
                    } else {
                        pmm = avanceobjdirmm(n,trim,year);
                        if (trcol == false) {
                            avance = (pdir + pmm) / 2;
                            System.out.println("calobjdir: director y mando, el avance es de " + avance);
                        } else {
                            pcol = avanceobjdir(n,trim,year);
                            avance = (pcol + pmm + pdir) / 3;
                            System.out.println("calobjdir: Todos participan, el avance es de " + avance);
                        }
                    }
                } else {
                    if (trmm == false) {
                        System.out.println("calobjdir: El avance es inexistente, el objetivo no tiene implementacion ");
                    } else {
                        pmm = avanceobjdirmm(n,trim,year);;
                        if (trcol == false) {
                            avance = pmm;
                            System.out.println("calobjdir: Mando medio con avance de " + avance);
                        } else {
                            pcol = avanceobjdir(n,trim,year);
                            avance = (pcol + pmm) / 2;
                            System.out.println("calobjdir: Mando y colaborador, el avance es de: " + avance);
                        }
                    }
                }
                System.out.println("Avance="+avance + "para el id de objetivo numero "+n);
                Cambiar.objdircumple(n, avance);
                Cambiar.calificarobjdir(n);
            }
        }
        Algcal.HDireccion(dir,trim,year);
        if (Algcal.activarcalplan() == true) {
            calobjdirplan();
        }
    }

    /**
     * Calificaciones de los objetivos de dirección a nivel de plan estratégico.
     */
    public static void calobjdirplan() {
        int[] tac = idtacticas();
        
        int trim=Seleccion.calculatrimestre();
        int year= new java.util.Date().getYear()+1900;
        //int trim=3;
        //int year= 2013;
        for (int i = 0; i < tac.length; i++) {
            int idtac = tac[i];
           
                //int iddir = dir[k];
                //Algcal.cumpletac(idtac,iddir,trim,year);
                Algcal.HTacticas(idtac,trim,year);
           
        }
    }

    /**
     * selección en un arreglo de enteros de los id de las direcciones de la
     * empresa
     *
     * @return arreglo de id de las direcciones
     */
    public static int[] direccionesemp() {
        int[] ret = new int[totaldirecciones()];
        String sql = "select id from direccion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                ret[i] = rs.getInt(1);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(ret));
        return ret;
    }

    /**
     * Método que retorna los id de objetivos de una dirección relacionados a
     * una táctica
     *
     * @param tac id de la táctica
     * @param dir id de la dirección
     * @return arreglo de enteros con los id de los objetivos de dirección
     */
    public static int[] idobjdir(int tac, int dir,int trim) {
        int[] ret = new int[totalobjdirxtac(tac, dir,trim)];
        //int trim = calculatrimestre();
        String sql = "select a.idobjdir from objdir a,tactica b where a.idtac=b.idtac and a.idtac=? and a.trimestre=? and (a.estado='No Terminado' or a.estado='Terminado') and a.direccion=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tac);
            pst.setInt(2, trim);
            pst.setInt(3, dir);
            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                ret[i] = rs.getInt(1);
                System.out.println("Valor de idobjdir=" + ret[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(ret));
        return ret;
    }

    /**
     * Numero de objetivos de dirección en base a la táctica y dirección
     * asignados por el trimestre actual
     *
     * @param tac id de la táctica a buscar
     * @param dir id de la dirección a buscar
     * @return el numero de objetivos relacionados a la táctica y dirección
     */
    public static int totalobjdirxtac(int tac, int dir,int trim) {
        int total = 0;
        System.out.println("totalobjdirxtac: los valores de tac=" + tac + " valor de direccion=" + dir);
        //int trim = calculatrimestre();
        String sql = "select count(a.idobjdir) from objdir a,tactica b where a.idtac=b.idtac and a.idtac=? and a.trimestre=? and (a.estado='No Terminado' or a.estado='Terminado') and a.direccion=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tac);
            pst.setInt(2, trim);
            pst.setInt(3, dir);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(total));
        return total;
    }

    /**
     * Lista de los id de las tacticas por el plan actual
     *
     * @return arreglo de enteros con los id de las tacticas del plan.
     */
    public static int[] idtacticas() {
        int[] res = planestra();
        int plan = res[1];
        //int trim=calculatrimestre();
        int[] ret = new int[totaltacticasplan(plan)];
        String sql = "select idtac from tactica where plan = ? and estado!='Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                ret[i] = rs.getInt(1);
                System.out.println("Valor de idtac=" + ret[i]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(ret));
        return ret;
    }

    /**
     * Suma de los logros de una cedula de colaboradores.
     *
     * @param cedula id de la cedula a revisar.
     * @param trim id del trimestre actual.
     * @return entero que representa la suma del total de su cedula.
     */
    public static int datcedulacol(int cedula, int trim) {
        int total = 0;
        String sql = "select SUM(logro) from objcol where cedula=? and trimestre=? and estado='Terminado' or estado='No Terminado'; ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Cambiar.valorcedula(cedula, total);
        //System.out.println(total);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(total));
        return total;
    }

    /**
     * Metodo que suma los logros de una cedula de mando medio.
     *
     * @param cedula id de la cedula
     * @param trim id del trimestre
     * @return entero que representa la suma de logros de la cedula de mando
     * medio
     */
    public static int datcedulamm(int cedula, int trim) {
        int total = 0;
        String sql = "select SUM(logro) from objmm where cedula=? and trimestre=? and estado='Terminado' or estado='No Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        //Cambiar.valorcedula(cedula, total);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(total));
        return total;
    }

    /**
     * Sumatoria de logros de una cedula de director
     *
     * @param cedula id de la cedula a revisar
     * @param trim id del trimestre actual
     * @return el entero que representa la sumatoria de los objetivos.
     */
    public static int datceduladir(int cedula, int trim) {
        int total = 0;
        String sql = "select SUM(logro) from obdirector where cedula=? and trimestre=? and estado='Terminado' or estado='No Terminado' ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        //Cambiar.valorcedula(cedula, total);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(total));
        return total;
    }

    /**
     * Seleccion en lista por id de dominio estrategico.
     *
     * @param dominio id del dominio a buscar
     * @return Lista tipo grid con los datos de la tactica.
     */
    public static List<Grid> tacticasxdominioL(int dominio) {
        List<Grid> lista = new ArrayList<Grid>();
        String sql = "select idtac,nombre,descripcion,dominio,peso,cumple,resultado,logro from tactica where dominio=? and estado !='Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dominio);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                Grid g = new Grid();
                g.setId(rs.getInt(1));
                g.setNombre(rs.getString(2));
                g.setDescripcion(rs.getString(3));
                g.setLigav(rs.getInt(4));
                g.setPeso(rs.getInt(5));
                g.setCumple(rs.getInt(6));
                g.setRes(rs.getString(7));
                g.setLogro(rs.getInt(8));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        //System.out.println(lista);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Lista de objetivos de direccion asociados a una tactica
     *
     * @param tactica id de la tactica a buscar
     * @param direccion id de la direccion
     * @return Lista de tipo Grid
     * @see Grid
     */
    public static List<Grid> objdirlista(int tactica, int direccion) {
        List<Grid> lista = new ArrayList<Grid>();
        String sql = "select idobjdir,nombre,descripcion,idtac,peso,cumple,resultado,logro from objdir where idtac=? and direccion=? and estado !='Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tactica);
            pst.setInt(2, direccion);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                Grid g = new Grid();
                g.setId(rs.getInt(1));
                g.setNombre(rs.getString(2));
                g.setDescripcion(rs.getString(3));
                g.setLigav(rs.getInt(4));
                g.setPeso(rs.getInt(5));
                g.setCumple(rs.getInt(6));
                g.setRes(rs.getString(7));
                g.setLogro(rs.getInt(8));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
       // System.out.println(lista);
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Metodo que devuelve las direcciones en una matriz de String
     *
     * @return String[][] posicion 0=id, posicion 1=nombre
     */
    public static String[][] direccionesA() {
        String[][] ret = new String[totaldirecciones() + 1][2];
        String sql = "select id,nombre from direccion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                ret[i][0] = String.valueOf(rs.getInt(1));

                ret[i][1] = rs.getString(2);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(ret));
        return ret;
    }

    /**
     * Metodo que devuelve el total de direcciones de la empresa
     *
     * @return entero que representa el total de direcciones.
     */
    public static int totaldirecciones() {
        int total = 0;
        String sql = "select count(id) from direccion;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
            //System.out.println("Hay un total de " + total + "direcciones");
            Gson gson = new GsonBuilder().setPrettyPrinting().create();
            System.out.println(gson.toJson(total));
            return total;
        }
    }

    /**
     * Metodo que selecciona el promedio de cumplimiento por tactica en base al
     * plan activo
     *
     * @return promedio de el cumplimiento de las tacticas.
     */
    public static int avanceplan() {
        int total = 0;
        String sql = "select TRUNCATE(avg(a.cumple),0) from tactica a,plan b where b.idplan=a.plan and b.activo=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
            return total;
        }
    }

    /**
     * Promedio de cumplimiento de objetivos relacionados a una tactica
     *
     * @param tactica id de la tactica
     * @return promedio de cumplimientos
     */
    public static int avancetactica(int tactica) {
        int total = 0;
        String sql = "select TRUNCATE(avg(b.cumple),0) from tactica a,objdir b where b.idtac=a.idtac and b.idtac=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, tactica);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo booleano que busca relacion de un objetivo de director con un
     * objetivo de direccion.
     *
     * @param idobjdir id del objetivo de direccion
     * @return true si hay relacion, false si no es el caso
     */
    public static boolean tienerelacionD(int idobjdir,int trim,int year) {
        boolean b = true;
        int total = 0;
        //java.util.Date d = new java.util.Date();
        String sql = "select count(a.id) from obdirector a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and a.aregistro=? and a.trimestre=? and (a.estado='Terminado' || a.estado='No Terminado');";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idobjdir);
            pst.setInt(2,year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        if (total == 0) {
            System.out.println("tienerelacionD: No tiene relacion con nada " + total);
            b = false;
        }
        System.out.println("tienerelacionD: relacion con un numero de objetivos " + total);
        return b;
    }

    /**
     * Metodo booleano que busca una relacion entre los objetivos de colaborador
     * con un objetivo de direccion
     *
     * @param objdir id del objetivo de direccion
     * @return true si hay relacion, false si no es el caso
     */
    public static boolean tienerelacion(int objdir,int trim,int year) {
        boolean b = true;
        int total = 0;
        //java.util.Date d = new java.util.Date();
        String sql = "select count(a.id) from objcol a,objdir b,objmm c where b.idobjdir=c.objdir and a.objefe=c.id and b.idobjdir=? and a.aregistro=? and a.trimestre=? and (a.estado='No Terminado' || a.estado='Terminado');";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, objdir);
            pst.setInt(2, year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        if (total == 0) {
            System.out.println("tienerelacion: No tiene relacion con el objetivo, no se agrega al promedio" + total);
            b = false;
        }
        System.out.println("tienerelacion " + total);
        return b;
    }

    /**
     * Metodo booleano que busca la relacion entre un objetivo de direccion y un
     * mando medio
     *
     * @param idobjdir id el objetivo de direccion
     * @return true si hay realcion, false si no es el caso.
     */
    public static boolean tienerelacionmm(int idobjdir,int trim,int year) {
        System.out.println("tienerelacionmm");
        boolean b = true;
        int total = 0;
       // java.util.Date d = new java.util.Date();
        String sql = "select count(a.id) from objmm a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and a.aregistro=? and a.trimestre=? and (a.estado='Terminado' || a.estado='No Terminado');";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idobjdir);
            pst.setInt(2, year);
            pst.setInt(3, trim);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        if (total == 0) {
            System.out.println("tienerelacionmm: No tiene relacion " + total);
            b = false;
        }
        System.out.println("tienerelacionmm: " + total);
        return b;
    }

    /**
     * Metodo que hace promedio del cumplimiento de los objetivos de colaborador
     * asociados a un objetivo de direccion
     *
     * @param idobjdir id del objetivo de dirección
     * @return promedio de cumplimiento de objetivos de colaborador
     */
    public static int avanceobjdir(int idobjdir,int trim,int year) {
        System.out.println("avanceobjdir");
        int total = 0;
        //java.util.Date n = new java.util.Date();
       // int trim = calculatrimestre(); n.getYear() + 1900
        String sql = "select TRUNCATE(avg(a.cumple),0) from objcol a,objdir b,objmm c where b.idobjdir=c.objdir and a.objefe=c.id and b.idobjdir=? and b.trimestre=? and c.trimestre=? and a.trimestre=? and b.aregistro=? and c.aregistro=? and a.aregistro=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idobjdir);
            pst.setInt(2, trim);
            pst.setInt(3, trim);
            pst.setInt(4, trim);
            pst.setInt(5, year);
            pst.setInt(6,year);
            pst.setInt(7, year);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo que promedia el cumplimiento de un objetivo de direcion en base a
     * su cumplimiento
     *
     * @param idobjdir id del objetivo de direccion
     * @return promedio de cumplimiento de los mandos medios en base al objetivo
     * de direccion
     */
    public static int avanceobjdirmm(int idobjdir,int trim,int year) {
        System.out.println("avanceobjdirmm");
        int total = 0;
        //java.util.Date n = new java.util.Date();
        //int trim = calculatrimestre(); n.getYear() + 1900
        String sql = "select TRUNCATE(avg(a.cumple),0) from objmm a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and b.trimestre=? and a.trimestre=? and b.aregistro=? and a.aregistro=?;;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idobjdir);
            // pst.setInt(2, trim);
            pst.setInt(2, trim);
            pst.setInt(3, trim);
            pst.setInt(4, year);
            pst.setInt(5, year);
            //  pst.setInt(6, n.getYear() + 1900);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo promedia los cumplimientos de objetivos de director en base a el
     * objetivo de direccion
     *
     * @param idobjdir id de objetivo de direccion
     * @return promedio de avance de objetivos de director x obj de direccion
     */
    public static int avanceobjdirD(int idobjdir,int trim,int year) {
        System.out.println("avanceobjdirD");
        int total = 0;
        //java.util.Date n = new java.util.Date();
        //int trim = calculatrimestre(); n.getYear() + 1900
        String sql = "select TRUNCATE(avg(a.cumple),0) from obdirector a,objdir b where b.idobjdir=a.objdir and b.idobjdir=? and b.trimestre=? and a.trimestre=? and b.aregistro=? and a.aregistro=?;;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, idobjdir);
            pst.setInt(2, trim);
            // pst.setInt(3, trim);
            pst.setInt(3, trim);
            pst.setInt(4, year);
            pst.setInt(5, year);
            // pst.setInt(6, n.getYear() + 1900);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo que retrna una lista de puestos que ya fueron aceptados
     *
     * @param puesto id del puesto que da la modificacion (director o mando)
     * @return Lista tipo grid con el nimbre e id de las cedulas que ya fueron
     * revisadas
     * @see Grid3
     */
    public static List<Grid3> pormodificarL(int puesto) {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.aceptado=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                g.setNombre(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Metodo que entrega en una lista los candidatos a modificar cedula para el
     * director
     *
     * @param puesto id del puesto que hara el cambio
     * @return Lista con el id de cedula y nombre de su propietario.
     * @see Grid3
     */
    public static List<Grid3> pormodificarLDir(int puesto) {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.aceptdir=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                g.setNombre(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Lista de que distinge a los que van a ser aceptador pos un puesto en
     * especial
     *
     * @param puesto id el puesto a tratar
     * @return Lista tipo grid3 con el id de cedula y el nombre del propietario
     */
    public static List<Grid3> poraceptarL(int puesto) {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.solob=1 and b.aceptado=0;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                g.setNombre(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Lista de cedulas asociadas de un director que debe aprobar
     *
     * @param puesto id del puesto
     * @return Lista de cedulas con el id de cedula y nombre de propietario
     */
    public static List<Grid3> poraceptarLDir(int puesto) {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.solobdir=1 and b.aceptado=0;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                g.setNombre(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     *
     * @param puesto
     * @return
     */
    public static String[][] pormodificar(int puesto) {
        String[][] datos = new String[totalsubxpuestorev(puesto) + 1][2];
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.aceptado=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     *
     * @param puesto
     * @return
     */
    public static String[][] poraceptar(int puesto) {
        String[][] datos = new String[totalsubxpuestosinrev(puesto) + 1][2];
        String sql = "select b.id,c.nombre from detpuesto a,cedula b,usuarios c where  a.idpuesto=? and a.abajo=b.puesto and c.puesto=a.abajo and b.solob=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Metodo que calcula los subordinados de un puesto que no han sido
     * revisados
     *
     * @param puesto id el puesto a revisar
     * @return total de subordinados, si 0 no tiene
     */
    public static int totalsubxpuestosinrev(int puesto) {
        int total = 0;
        String sql = "select count(a.id) from detpuesto a,cedula b where  a.idpuesto=? and a.abajo=b.puesto  and b.solob=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodoq que revela el total de pustos que son dependientes y tienen
     * aceptadas sus cedulas
     *
     * @param puesto id el puesto abuscar
     * @return numero de dependientes con cedula aceptada
     */
    public static int totalsubxpuestorev(int puesto) {
        int total = 0;
        String sql = "select count(a.id) from detpuesto a,cedula b where  a.idpuesto=? and a.abajo=b.puesto  and b.aceptado=1;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Promedio de los logros en base a los objetivos de cedula.
     *
     * @param cedula id cedula
     * @param trimestre id trim
     * @return promedio de logros (calificacion de cedula)
     */
    public static int promxobdirector(int cedula, int trimestre) {
        int ret = 0;
        String sql = "select avg(logro) from obdirector where trimestre=? and cedula=? and estado!='Anulado' and estado!='Terminado';";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trimestre);
            pst.setInt(2, cedula);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Promedio de los logros de la cedula de un mando medio
     *
     * @param cedula id cedula
     * @param trimestre id trim
     * @return promedio de sus objetivos (calificacion de cedula)
     */
    public static int promxobjmm(int cedula, int trimestre) {
        int ret = 0;
        String sql = "select avg(logro) from objmm where trimestre=? and cedula=? and estado!='Anulado' and estado!='Terminado';";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trimestre);
            pst.setInt(2, cedula);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Promedio de los objetivos de una cedula de colaborador
     *
     * @param cedula id de cedula
     * @param trimestre id de cedula
     * @return promedio de la cedula.
     */
    public static int promxcedulacol(int cedula, int trimestre) {
        int ret = 0;
        String sql = "select avg(logro) from objcol where trimestre=? and cedula=? and estado!='Anulado' and estado!='Terminado';";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trimestre);
            pst.setInt(2, cedula);

            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Promedio de las cedulas por direccion
     *
     * @param dir id direccion
     * @return promedio de cedulas por direccion
     */
    public static int promcedireccion(int dir) {
        String sql = "select avg(a.resultado) from cedula a.dependencia b where a.puesto=b.dep and b.dep=?;";
        int ret = 0;
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }
    //local

    /**
     * Sumatoria de logros en base al od de una direccion
     *
     * @param id id de la direccion a buscar
     * @return promedio de losgos de toda la direccion de sus obj de direccion
     */
    public static int avanzexdireccion(int id, int trim, int are) {
        int ret = 0;
        String sql = "select sum(logro) from objdir where direccion=? and trimestre=? and aregistro=? and (estado='Terminado' or estado='No Terminado');";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                ret = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     *
     * método booleano que obtiene el turno de una dirección
     *
     * @param id id de la direccion
     * @return false si no tiene el turno
     */
    public static boolean obtenerturno(int id) {
        boolean ret = false;
        String sql = "select turno from direccion where id=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                if (rs.getInt(1) == 1) {
                    ret = true;
                }
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Metodo que retiorna el numero permitido de tacticas en la configuracion
     * de plan
     *
     * @return numero del tacticas por plan
     */
    public static int numtacticas() {
        int total = 0;
        String sql = "select tacticas from configuracion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;

    }

    /**
     * Metodo que determina el limite de objetivos de direccion en la
     * configuracion
     *
     * @return numero de objetivos limite en la configuracion
     */
    public static int numobjdir() {
        int total = 0;
        String sql = "select objdir from configuracion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Numero de objetivos maximos del colaborador
     *
     * @return numeor de objetivos maximos para la configuracion
     */
    public static int numobjcol() {
        int total = 0;
        String sql = "select objcol from configuracion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Método que determina si se esta en periodo de calificación en es
     * trimestre.
     *
     * @param trim id del trimestre
     * @return 1 si esta en periodo, cero si no es el caso.
     */
    public static int calificar(int trim) {
        int resultado = 0;

        ComparadorFechas c = new ComparadorFechas();
        Date fecha = new Date(new java.util.Date().getTime());
        // Date fecha2=new Date(fecha.getYear(),11,26);
        Date enero = new Date(fecha.getYear() + 1, 0, 1);
        Date abril = new Date(fecha.getYear(), 4, 1);
        Date julio = new Date(fecha.getYear(), 6, 1);
        Date octubre = new Date(fecha.getYear(), 9, 1);
        //System.out.println(fecha2);
        switch (trim) {
            case 4:
                System.out.println(c.resta_diaslaborales(enero, 10));
                System.out.println(enero);
                c.setfechas(c.resta_diaslaborales(enero, 10), enero);
                if (c.estadentrode(fecha) == true) {
                    resultado = 1;
                }
                break;
            case 1:
                System.out.println(c.resta_diaslaborales(abril, 10));
                System.out.println(abril);
                c.setfechas(c.resta_diaslaborales(abril, 10), abril);
                if (c.estadentrode(fecha) == true) {
                    resultado = 1;
                }
                break;
            case 2:
                System.out.println(c.resta_diaslaborales(julio, 10));
                System.out.println(julio);
                c.setfechas(c.resta_diaslaborales(julio, 10), julio);
                if (c.estadentrode(fecha) == true) {
                    resultado = 1;
                }
                break;
            case 3:
                System.out.println(c.resta_diaslaborales(octubre, 10));
                System.out.println(octubre);
                c.setfechas(c.resta_diaslaborales(octubre, 10), octubre);
                if (c.estadentrode(fecha) == true) {
                    resultado = 1;
                }
                break;
        }
        ////System.gc();
        System.out.println("calificar: es tiempo? " + resultado);

        return resultado;
    }

    /**
     * método que devuelve un String[][] para meterlo en una lista de Wavemaker,
     * usa id y nombre de un mando medio
     *
     * @param puesto id el puesto a revisar
     * @return id y nombre en posiciones 0 y 1 respectivamente.
     */
    public static String[][] listacol(int puesto, int trim, int are) {
        String[][] datos = new String[avanzacol(puesto) + 1][2];
        String sql = "";
        if (calificar(trim) == 1) {
            sql = "select id,nombre from objmm where cedula=(select id  from cedula where puesto=(select arriba from detpuesto where idpuesto=?)) and estado != 'Anulado' and trimestre=? and aregistro=?;";
        } else {
            sql = "select id,nombre from objmm where cedula=(select id  from cedula where puesto=(select arriba from detpuesto where idpuesto=?)) and (estado = 'Inscrito'||estado = 'En Revisión') and trimestre=? and aregistro=?;";
        }
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Método que arroja los datos de los objetivos de dirección en base al id
     * de la dirección para ser lista
     *
     * @param dir id de la dirección
     * @return String[][] con el id y nombre en posición 0 y 1 respectivamente.
     */
    public static String[][] listaresto(int dir) {
        String[][] datos = new String[avanzaresto(dir) + 1][2];
        String sql = "select a.idobjdir,a.nombre from objdir a where direccion=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                System.out.println(datos[i][0]);
                datos[i][1] = rs.getString(2);
                System.out.println(datos[i][1]);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return datos;
    }

    /**
     * Metodo que en base al numero muestra si un jefe de colaborador tiene
     * objetivos para poder ingresar
     *
     * @param puesto id del puesto
     * @return Si 0 entonces no hay objetivos a seguir.
     */
    public static int avanzacol(int puesto) {
        int total = 0;
        int trim = calculatrimestre();
        String sql = "select count(a.id) from objmm a where a.trimestre=? and a.cedula=(select id from cedula  where puesto=(select arriba from detpuesto where idpuesto=?) );";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trim);
            pst.setInt(2, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo que revisa si hay objetivos de direccion para la direccion
     * existente
     *
     * @param dir id de la direccion
     * @return numero de objetivos de la direccion
     */
    public static int avanzaresto(int dir) {
        int total = 0;
        String sql = "select count(a.idobjdir) from objdir a where direccion=?;";
        PreparedStatement pst = null;
        Connection conn = null;

        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dir);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Obtiene la direccion de un puesto en base al id
     *
     * @param user id del puesto a buscar
     * @return el id de la direccion del puesto
     */
    public static int direccion(int user) {
        int dir = 0;
        String sql = "select dep from dependencia where idpuesto=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, user);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                dir = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }

        return dir;
    }

    /**
     * El metodo crea una lista de dominios de la base de datos
     *
     * @return entero del total de dominios existentes
     */
    public static int dominioslista() {
        int lista = 0;
        String sql = "select count(id) from dominios";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                lista = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return lista;
    }

    /**
     * Metodo que selecciona los datos de los valores de id y nombre del dominio
     *
     * @return String[][] de id y nombre en posiciones 0 y 1 respectivamente
     */
    public static String[][] valoresdom() {
        String[][] ret = new String[dominioslista() + 1][2];
        String sql = "select id,nombre from dominios";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                ret[i][0] = String.valueOf(rs.getInt(1));
                ret[i][1] = rs.getString(2);
                //System.out.println(ret[i][0]);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return ret;
    }

    /**
     * Total de tacticas de un plan que no son anulados ni terminados
     *
     * @param plan id del plan a buscar
     * @return string posicion 0 es idtac, posicion 1 es nombre
     */
    public static String[][] tacticaslista(int plan) {
        String lista[][] = new String[totaltacticasplan(plan) + 1][2];
        String sql = "select idtac,nombre from tactica where plan=? and estado!='Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {

                lista[i][0] = String.valueOf(rs.getInt(1));
                lista[i][1] = rs.getString(2);
                i++;

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return lista;
    }

    /**
     * metodo que devuelve la cedula en base al id de usuario
     *
     * @param user id de usuario
     * @return id del usuario
     */
    public static int idcedula(int user) {
        int total = 0;
        String sql = "select id from cedula where usuario=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, user);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println(total);
        return total;
    }

    /**
     * Metodo que devuele si hay una cedula para un usuario
     *
     * @param id id del usuario
     * @return numero 1 si tiene cedula, cero si no es el caso
     */
    public static int haycedula(int id) {
        int total = 0;
        String sql = "select count(id) from cedula where usuario=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println(total);
        return total;
    }

    /**
     * Metodo que devuelve el nivel en base al id de usuario
     *
     * @param id id de usuario
     * @return el nivel del usuario
     */
    public static int puestodeuser(int id) {

        int jefe = 0;
        String sql = "select puesto from usuarios where id=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                jefe = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }

        return jefe;

    }

    /**
     * Nombre del jefe imediado en base a el id de puesto
     *
     * @param id id del puesto a buscar
     * @return String con el nombre del jefe
     */
    public static String jefe(int id) {
        String jefe = "";
        String sql = "select nombre from usuarios where puesto=(select arriba from detpuesto where idpuesto=? LIMIT 1);";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                jefe = rs.getString(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println("El nombre del jefe es: " + jefe);
        return jefe;
    }

    /**
     * metodoq ue devuelve el nivel de un usuario en base a su id
     *
     * @param id id del usuario
     * @return nivel del usuario
     */
    public static int niveldeuser(int id) {
        int total = 0;
        String sql = "select nivel from usuarios where id=?;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, id);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return total;
    }

    /**
     * Metodo que calcula el trimestre actual
     *
     * @return numero de trimestre que va del 1 al 4
     */
    public static int calculatrimestre() {
        int trim = 0;
        Date fecha = ComparadorFechas.pasalo(new java.util.Date());
        Date abr1 = new Date(fecha.getYear(), 3, 1);
        // System.out.println(abr1);
        Date jul1 = new Date(fecha.getYear(), 6, 1);
        // System.out.println(jul1);
        Date oct1 = new Date(fecha.getYear(), 9, 1);
        // System.out.println(oct1);
        Date com = null;
        Date abr5 = null;
        Date jul5 = null;
        Date oct5 = null;
        Date fin = null;
        ComparadorFechas c = new ComparadorFechas();
        String sql = "select comienzo,abril5, julio5,octubre5,fin from configuracion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                com = rs.getDate(1);
                //  System.out.println(com);
                abr5 = rs.getDate(2);
                //  System.out.println(abr5);
                jul5 = rs.getDate(3);
                // System.out.println(jul5);
                oct5 = rs.getDate(4);
                //  System.out.println(oct5);
                fin = rs.getDate(5);
                //  System.out.println(fin);
            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        boolean p1;
        boolean p2;
        boolean p3;
        boolean p4;
        boolean pux1;
        boolean pux2;
        boolean pux3;
        // boolean pux4;

        c.setfechas(com, abr1);
        p1 = c.estadentrode(fecha);
        c.setfechas(abr1, abr5);
        pux1 = c.estadentrode(fecha);
        c.setfechas(abr5, jul1);
        p2 = c.estadentrode(fecha);
        c.setfechas(jul1, jul5);
        pux2 = c.estadentrode(fecha);
        c.setfechas(jul5, oct1);
        p3 = c.estadentrode(fecha);
        c.setfechas(oct1, oct5);
        pux3 = c.estadentrode(fecha);
        c.setfechas(oct5, fin);
        p4 = c.estadentrode(fecha);

        //System.out.println("P1 vale por "+p1);
        //System.out.println("P2 vale por "+p2);
        //System.out.println("P3 vale por "+p3);
        //System.out.println("P4 vale por "+p4);
        //System.out.println("P1 vale por "+pux1);
        //System.out.println("P2 vale por "+pux2);
        //System.out.println("P3 vale por "+pux3);
        //System.out.println("P4 vale por "+pux4);
        if (p1 == true) {
            System.out.println("Primero");
            trim = 1;
        }
        if (pux1 == true) {
            trim = 1;
        }
        if (p2 == true) {
            //System.out.println("Segundo");
            trim = 2;
        }
        if (pux2 == true) {
            //System.out.println("Segundo");
            trim = 2;
        }
        if (p3 == true) {
            //System.out.println("Tercero");
            trim = 3;
        }
        if (pux3 == true) {
            // System.out.println("Tercero");
            trim = 3;
        }
        if (p4 == true) {
            // System.out.println("Cuarto");
            trim = 4;
        }

        //System.out.println("calculatrimestre: El trimestre actual es " + trim);
        return trim;
    }
    //Saber la configuracion del sistema

    /**
     * Metodo que selecciona la configuracion en un arreglo de Strings
     *
     * @return arreglo con la configuracion
     */
    public static String[] configuracion() {
        String[] datos = new String[19];
        String sql = "select enero5,enero10,abril5,abril10,julio5,julio10,octubre5,octubre10,marzo,junio,septiembre,diciembre,objcol,objdir,tacticas,ano,fin,comienzo from configuracion";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                datos[1] = rs.getDate(1).toString();
                datos[2] = rs.getDate(2).toString();
                datos[3] = rs.getDate(3).toString();
                datos[4] = rs.getDate(4).toString();
                datos[5] = rs.getDate(5).toString();
                datos[6] = rs.getDate(6).toString();
                datos[7] = rs.getDate(7).toString();
                datos[8] = rs.getDate(8).toString();
                datos[9] = rs.getDate(9).toString();
                datos[10] = rs.getDate(10).toString();
                datos[11] = rs.getDate(11).toString();
                datos[12] = rs.getDate(12).toString();
                datos[13] = String.valueOf(rs.getInt(13));
                datos[14] = String.valueOf(rs.getInt(14));
                datos[15] = String.valueOf(rs.getInt(15));
                datos[16] = String.valueOf(rs.getInt(16));
                datos[17] = String.valueOf(rs.getInt(17));
                datos[18] = String.valueOf(rs.getInt(18));
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }
    //saber el nivel de puesto por id de puesto

    /**
     * Metodo que obtiene el nivel en base al id de puesto
     *
     * @param puesto id del puesto a buscar
     * @return id del nivel a usar
     */
    public static int nivelpuesto(int puesto) {
        String sql = "select nivel from puestos where id=?";
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return total;
    }

    /**
     * Metodo que devuele un arreglo conlos puestos dependientes del cargo.
     *
     * @param puesto id del puesto
     * @return arreglo con los id de sus dependientes
     */
    public static int[] puestosdependientes(int puesto) {
        int[] datos = new int[3];
        String sql = "select arriba,abajo from detpuesto where idpuesto=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                datos[1] = rs.getInt(1);
                datos[2] = rs.getInt(2);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Numero de puestos dependientes para el cargo enmencion
     *
     * @param puesto id del puesto
     * @return numero de puestos dependientes
     */
    public static int totalpuestosdep(int puesto) {
        int total = 0;
        String sql = "select count(id) from detpuesto where idpuesto=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                //System.out.println("Existe un total de " + total + " tacticas  para el dominio");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * metodo que obtiene el id de user para en base al id de cedula
     *
     * @param cedula id de la cedula
     * @return entro que representa el id del user
     */
    public static int userxcedula(int cedula) {
        int user = 0;
        String sql = "select usuario from cedula where id=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                user = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println(user);
        return user;
    }
    //Datos de la cedula

    /**
     * Metodo que debuelve los datos de cedula
     *
     * @param user id del usuario
     * @param cedula id de la cedula
     * @param puesto id del puesto
     * @param dir id de la direccion
     * @return Arreglo String con 12 posiciones
     */
    public static String[] cedulatotal(int user, int cedula, int puesto, int dir) {
        String[] datos = new String[10];
        String sql = "select a.nombre,b.nombre,e.nombre,d.jefe,d.aceptado,d.aceptdir,d.acepttac,d.solob,d.solobdir,d.soltac from usuarios a,puestos b,dependencia c,cedula d,direccion e where d.id=? and a.id=? and b.id=? and e.id=? limit 1; ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, user);
            pst.setInt(3, puesto);
            pst.setInt(4, dir);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                datos[0] = rs.getString(1);
                datos[1] = rs.getString(2);
                datos[2] = rs.getString(3);
                datos[3] = rs.getString(4);
                datos[4] = String.valueOf(rs.getInt(5));
                datos[5] = String.valueOf(rs.getInt(6));
                datos[6] = String.valueOf(rs.getInt(7));
                datos[7] = String.valueOf(rs.getInt(8));
                datos[8] = String.valueOf(rs.getInt(9));
                datos[9] = String.valueOf(rs.getInt(10));

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        int cal=Algcal.calificado(cedula);
        int per=calificar(calculatrimestre());
        if (per == 0 && cal == 1) {
            Algcal.aceptacal(cedula);
        }
        if (per == 0 && cal == 2) {
            Algcal.cierracal(cedula);
        }
        if (per == 1 && cal == 3) {
            Algcal.cierracal(cedula);
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Metodo que revisa los datos en un arreglo del plan actual
     *
     * @return arreglo de enteros con los datos del plan
     */
    public static int[] planestra() {
        int[] datos = new int[6];
        String sql = "select idplan,duracion,avance,comienzo,final from plan where activo=1";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                datos[1] = rs.getInt(1);
                datos[2] = rs.getInt(2);
                datos[3] = rs.getInt(3);
                datos[4] = rs.getInt(4);
                datos[5] = rs.getInt(5);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return datos;
    }

    /**
     * método que devuelve los datos de los objetivos de dirección por trimestre
     * y por dirección si los objetivos son distintos de anulados o terminados
     *
     * @param dir id de la dirección
     * @param trim numero de trimestre
     * @return String[][] con datos
     * id,nombre,descripción,idtac,peso,cumple,resultado y logro en ese orden
     */
    public static String[][] objdir(int dir, int trim, int are) {
        String[][] datos = new String[totalobjdireccion(dir, trim, are) + 1][8];
        String sql = "";
        if (calificar(trim) == 1) {
            sql = "select idobjdir,nombre,descripcion,idtac,peso,cumple,resultado,logro from objdir where estado!='Anulado' and trimestre=? and direccion=? and aregistro=?;";
        } else {
            sql = "select idobjdir,nombre,descripcion,idtac,peso,cumple,resultado,logro from objdir where estado!='Anulado' and estado!='Terminado' and estado!='No Terminado' and trimestre=? and direccion=? and aregistro=?;";
        }

        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trim);
            pst.setInt(2, dir);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                // System.out.println(datos[i][0]);
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = String.valueOf(rs.getInt(6));
                datos[i][6] = rs.getString(7);
                datos[i][7] = String.valueOf(rs.getInt(8));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Metodo que calcula el total de objetivos de direccion por direccion y si
     * no estn anulados o terminados en un trimestre dado
     *
     * @param dir id de la direccion
     * @param trim numero de trimestre
     * @return numero de objetivos con esos requisitos.
     */
    public static int totalobjdireccion(int dir, int trim, int are) {
        String sql = "";
        if (calificar(trim) == 1) {
            sql = "select count(idobjdir) from objdir where estado!='Anulado' and trimestre=? and direccion=? and aregistro=?;";
        } else {
            sql = "select count(idobjdir) from objdir where estado!='Anulado' and estado!='Terminado' and estado!='No Terminado' and trimestre=? and direccion=? and aregistro=?;";
        }
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, trim);
            pst.setInt(2, dir);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        System.out.println("Los objetivos de direccion son un total de " + total);
        return total;
    }

    /**
     * Metodo que obtiene los objetivos de un colaborador en base a su cedula y
     * el trimestre
     *
     * @param cedula id de la cedula
     * @param trim numero del trimestre
     * @return Lista de tipo grid2 con los datos de los objetivos de colaborador
     * @see Grid2
     */
    public static List<Grid2> objcedulacolL(int cedula, int trim, int are) {
        List<Grid2> lista = new ArrayList<Grid2>();
        //String[][] datos = new String[objcoltotales(cedula,trim) + 1][11];
        String sql = "select id,nombre,descripcion,objefe,peso,cumple,resultado,logro,comcol,comjefe,estado from objcol where cedula=? and estado!='Anulado' and estado!='No Terminado' and estado!='Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid2 d = new Grid2();
                d.setId(rs.getInt(1));
                d.setNombre(rs.getString(2));
                d.setDescripcion(rs.getString(3));
                d.setLiga(rs.getInt(4));
                d.setPeso(rs.getInt(5));
                d.setCumple(rs.getInt(6));
                d.setResultado(rs.getString(7));
                d.setLogro(rs.getInt(8));
                d.setComcol(rs.getString(9));
                d.setComjefe(rs.getString(10));
                lista.add(d);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Metodo que obtiene en una matriz los datos de la cedula de colaborador
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return String [][] con los datos
     * id,nombre,descripcion,objefe,cumole,resultado,logro,comcol,comjefe y
     * estado.
     */
    public static String[][] objcedulacol(int cedula, int trim, int are) {
        String[][] datos = new String[objcoltotales(cedula, trim, are)+1][11];
        String sql = "select id,nombre,descripcion,objefe,peso,cumple,resultado,logro,comcol,comjefe,estado from objcol where cedula=? and estado!='Anulado' and estado!='Terminado' and estado!='No Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = String.valueOf(rs.getInt(6));
                datos[i][6] = rs.getString(7);
                datos[i][7] = String.valueOf(rs.getInt(8));
                datos[i][8] = rs.getString(9);
                datos[i][9] = rs.getString(10);
                datos[i][10] = rs.getString(11);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Método que ontiene una lista con los objetivos de la cedula de un mando
     * medio en base a su id de cedulay el trimestre actual
     *
     * @param cedula id de cedula
     * @param trim trimestre actual
     * @return Lista de tipo Grid2 con los datos de objetivos de un mando medio
     */
    public static List<Grid2> objcedulammL(int cedula, int trim, int are) {
        List<Grid2> lista = new ArrayList<Grid2>();
        //  String[][] datos = new String[objmmtotales(cedula,trim) + 1][11];
        String sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from objmm where cedula=? and estado!='Anulado' and estado!='No Terminado' and estado!='Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                Grid2 d = new Grid2();
                System.out.println(rs.getInt(1));
                d.setId(rs.getInt(1));
                d.setNombre(rs.getString(2));
                d.setDescripcion(rs.getString(3));
                d.setLiga(rs.getInt(4));
                d.setPeso(rs.getInt(5));
                d.setCumple(rs.getInt(6));
                d.setResultado(rs.getString(7));
                d.setLogro(rs.getInt(8));
                d.setComcol(rs.getString(9));
                d.setComjefe(rs.getString(10));

                lista.add(d);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Metodo que obtiene una lista de los objetivos de un director en base a su
     * id de cedula y trimestre actual
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return Lista de tio Grid2 con los datos de objetivos de un director
     * @see Grid2
     */
    public static List<Grid2> objceduladirL(int cedula, int trim, int are) {
        List<Grid2> lista = new ArrayList<Grid2>();
        //  String[][] datos = new String[objmmtotales(cedula,trim) + 1][11];
        String sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from obdirector where cedula=? and estado!='Anulado' and estado!='No Terminado' and estado!='Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid2 d = new Grid2();
                d.setId(rs.getInt(1));
                d.setNombre(rs.getString(2));
                d.setDescripcion(rs.getString(3));
                d.setLiga(rs.getInt(4));
                d.setPeso(rs.getInt(5));
                d.setCumple(rs.getInt(6));
                d.setResultado(rs.getString(7));
                d.setLogro(rs.getInt(8));
                d.setComcol(rs.getString(9));
                d.setComjefe(rs.getString(10));

                lista.add(d);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }

    /**
     * Metodo que obtiene la cedula de mando medio, en base al id de la cedula y
     * al trimestre actual
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return String[][] con los datos
     */
    public static String[][] objcedulamm(int cedula, int trim, int are) {
        String[][] datos = new String[objmmtotales(cedula, trim, are) + 1][11];
        String sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from objmm where cedula=? and estado!='Anulado' and estado!='Terminado'  and estado!='No Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = String.valueOf(rs.getInt(6));
                datos[i][6] = rs.getString(7);
                datos[i][7] = String.valueOf(rs.getInt(8));
                datos[i][8] = rs.getString(9);
                datos[i][9] = rs.getString(10);
                datos[i][10] = rs.getString(11);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Metodo que muestra la cedula de un director en base al id de cedula y el
     * trimestre actual
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return String[][] con los datos de la cedula
     */
    public static String[][] objceduladir(int cedula, int trim, int are) {
        String[][] datos = new String[objdirtotales(cedula, trim, are) + 1][11];
        String sql = "select id,nombre,descripcion,objdir,peso,cumple,resultado,logro,comcol,comjefe,estado from obdirector where cedula=? and estado!='Anulado' and estado!='No Terminado' and estado!='Terminado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = String.valueOf(rs.getInt(6));
                datos[i][6] = rs.getString(7);
                datos[i][7] = String.valueOf(rs.getInt(8));
                datos[i][8] = rs.getString(9);
                datos[i][9] = rs.getString(10);
                datos[i][10] = rs.getString(11);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(datos));
        return datos;
    }

    /**
     * Metodo que retorna el total de tacticas ANULADAS
     *
     * @param plan id del plan
     * @return numero ed tacticas anuladas
     */
    public static int totaltacticasplanA(int plan) {
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        String sql = "select count(idtac) from tactica where plan = ? and estado!='Anulado' and estado!='Terminado'";
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                //System.out.println("Existe un total de " + total + " tacticas  para el dominio");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }
    //numero de tacticas por plan

    /**
     * Numero de tacticas de un plan que no han sido terminadas ni anuladas
     *
     * @param plan id del plan
     * @return numero de tacticas
     */
    public static int totaltacticasplan(int plan) {
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        String sql = "select count(idtac) from tactica where plan = ? and estado!='Anulado' and estado!='Terminado'";
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                //System.out.println("Existe un total de " + total + " tacticas  para el dominio");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }

        return total;
    }

    /**
     * Numero de tacticas asociadas al dominio y no estan anuladas
     *
     * @param dom id del dominio
     * @return total de tacticas para el dominio
     */
    public static int totaltacticasdomA(int dom) {
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        String sql = "select count(idtac) from tactica where dominio = ? and estado=='Anulado'";
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dom);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                System.out.println("Existe un total de " + total + " tacticas  para el dominio");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Total de taticas por dominios, tacticas que no han terminado ni han sido
     * anuladas
     *
     * @param dom id del dominio
     * @return total de tacticas del dominio
     */
    public static int totaltacticasdom(int dom) {
        int total = 0;
        PreparedStatement pst = null;
        Connection conn = null;
        String sql = "select count(idtac) from tactica where dominio = ? and estado!='Terminado' and estado!='Anulado'";
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dom);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                System.out.println("Existe un total de " + total + " tacticas  para el dominio");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metodo bandera que retorna si hay objetivos de direccion para el
     * trimestre vigente
     *
     * @param direccion id de la direccion
     * @return true si hay objetivos, false si no es el caso
     */
    public static boolean hayobjdir(int direccion) {
        boolean b = false;
        int trim = calculatrimestre();
        Connection conn = null;
        String sql = "select count(a.idobjdir) from objdir a,tactica b,plan c where b.idtac=a.idtac and b.plan=c.idplan and c.activo=1 and a.direccion=? and a.trimestre=? and a.estado!='Anulado' and a.estado!='Terminado' and aregistro=?;";
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, direccion);
            pst.setInt(2, trim);
            pst.setInt(3,new java.util.Date().getYear()+1900);
            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                i = rs.getInt(1);
            }
            if (i >= 1) {
                b = true;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return b;
    }

    /**
     * Metodo que consulta la existencia de un plan vigente
     *
     * @return true si existe, false si no es el caso.
     */
    public static boolean hayplan() {
        boolean b = false;
        String sql = "select count(idplan) from plan where activo=1";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();
            int i = 0;
            while (rs.next()) {
                i = rs.getInt(1);
            }
            if (i == 1) {
                b = true;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return b;

    }

    /**
     * tácticas de un dominio que fueron anulados del plan en base al dominio
     *
     * @param dom id del dominio
     * @return String[][] con los datos de tacticas anuladas
     */
    public static String[][] tacticasxdominioA(int dom) {
        String[][] datos = new String[totaltacticasdomA(dom) + 1][7];
        String sql = "select idtac,nombre,descripcion,peso,cumple,resultado,logro from tactica where dominio=? and estado =='Anulado' and estado!='Terminado";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dom);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = rs.getString(7);
                datos[i][6] = String.valueOf(rs.getInt(8));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Tacticas por dominoo que no han sido anuladas ni terminadas
     *
     * @param dom id del dominio a buscar
     * @return String[][] de las tacticas relacionadas
     */
    public static String[][] tacticasxdominio(int dom) {
        String[][] datos = new String[totaltacticasdom(dom) + 1][7];
        String sql = "select idtac,nombre,descripcion,peso,cumple,resultado,logro from tactica where dominio=? and estado!='Anulado' and estado!='Terminado";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, dom);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = rs.getString(7);
                datos[i][6] = String.valueOf(rs.getInt(8));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Metodo que envia las tacticas anuladas de un plan
     *
     * @param plan id del plan
     * @return String[][] con los datos de las tacticas
     */
    public static String[][] tacticasxplanAn(int plan) {
        String[][] datos = new String[totaltacticasplanA(plan) + 1][7];
        String sql = "select idtac,nombre,descripcion,peso,cumple,resultado,logro from tactica where plan=? and estado == 'Anulado' ";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = rs.getString(7);
                datos[i][6] = String.valueOf(rs.getInt(8));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * tacticas vigentes del plan
     *
     * @param plan id del plan
     * @return String[][] de los datoa de tactica
     */
    public static String[][] tacticasxplan(int plan) {
        String[][] datos = new String[totaltacticasplan(plan) + 1][8];
        String sql = "select idtac,nombre,descripcion,dominio,peso,cumple,resultado,logro from tactica where plan=? and estado != 'Anulado' and estado!='Terminado'";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, plan);

            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = rs.getString(3);
                datos[i][3] = String.valueOf(rs.getInt(4));
                datos[i][4] = String.valueOf(rs.getInt(5));
                datos[i][5] = String.valueOf(rs.getInt(6));
                datos[i][6] = rs.getString(7);
                datos[i][7] = String.valueOf(rs.getInt(8));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Datos para la lista de los dominos
     *
     * @return String[][] de id y nombre en posiciiones 0 id y 1 nombre
     */
    //Todos los dominios
    public static String[][] dominios() {
        String[][] datos = new String[totaldominios() + 1][2];
        String sql = "select id,nombre from dominios";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Numero del total de dominios existentes
     *
     * @return
     */
    public static int totaldominios() {
        int total = 0;
        String sql = "select count(id) from dominios";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                System.out.println("Existe un total de " + total + " dominios para el plan");
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Datos para la lista de los puestos
     *
     * @return String[][] en posicion 0 id, en posicion 1 nombre
     */
    public static String[][] puestos() {
        String[][] datos = new String[totalpuestos() + 1][3];
        String sql = "select id,nombre,nivel from puestos";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {
                datos[i][0] = String.valueOf(rs.getInt(1));
                datos[i][1] = rs.getString(2);
                datos[i][2] = String.valueOf(rs.getInt(3));
                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }
        }
        return datos;
    }

    /**
     * Metodo que devuelve el numero total de puestos de la empresa
     *
     * @return total de puestos
     */
    public static int totalpuestos() {
        int total = 0;
        String sql = "select count(id) from puestos";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println("totalpuestos: El total de puestos es: " + total);
        return total;
    }

    /**
     * Metodo que obtiene eun arreglo la direccion de un puesto
     *
     * @param puesto id del puesto asociado
     * @return arreglo de id que representan las direcciones asociadas
     */
    public static int[] direccionxpuesto(int puesto) {
        int[] datos = new int[totaldirxpuesto(puesto) + 1];

        String sql = "select dep from dependencia where idpuesto=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();
            int i = 1;
            while (rs.next()) {

                datos[i] = rs.getInt(1);

                i++;
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);;
            }

            return datos;
        }
    }

    /**
     * Método que calcula el total de direcciones asociadas a un puesto
     *
     * @param puesto id del puesto
     * @return numero de direcciones del puesto
     */
    public static int totaldirxpuesto(int puesto) {
        int total = 0;
        String sql = "select count(id) from detpuesto where idpuesto=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, puesto);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                //System.out.println("objetivostotales: Los objetivos de esta cedula " + cedula + " son " + total);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Metido que retorne al total de objetivos de colaborador que no están
     * terminados ni anulados y que corresponden al trimestre
     *
     * @param cedula id de la cédula
     * @param trim trimestre actual
     * @return numero de objetivos de colaborador con la descripción
     */
    public static int objcoltotales(int cedula, int trim, int are) {
        int total = 0;
        String sql = "select count(id) from objcol where cedula=? and estado!='Terminado' and estado!='No Terminado' and estado!='Anulado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        //System.out.println("objcoltotales: Los objetivos de esta cedula " + cedula + " son " + total);
        return total;
    }

    /**
     * Método que devuelve el total de objetivos de mando medio totales que no
     * estan anulados ni terminados
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return numero de objetivos de mando medio con estos requisitos
     */
    public static int objmmtotales(int cedula, int trim, int are) {
        int total = 0;
        String sql = "select count(id) from objmm where cedula=? and estado!='Terminado' and estado!='No Terminado' and estado!='Anulado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
                System.out.println("objmmtotales: Los objetivos de esta cedula " + cedula + " son " + total);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return total;
    }

    /**
     * Método que cuante el total de objetivos de director que no son anulados
     * ni terminados para un trimestre
     *
     * @param cedula id de la cedula
     * @param trim trimestre actual
     * @return numero de objetivo de direccion totales
     */
    public static int objdirtotales(int cedula, int trim, int are) {
        int total = 0;
        String sql = "select count(id) from obdirector where cedula=? and estado!='Terminado' and estado!='No Terminado' and estado!='Anulado' and trimestre=? and aregistro=?";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, cedula);
            pst.setInt(2, trim);
            pst.setInt(3, are);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);

            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                ////System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println("objdirtotales: Los objetivos de esta cedula " + cedula + " son " + total);
        return total;
    }

    /**
     * Metodo que devuelve las direcciones en una matriz de String
     *
     * @return List<Grid3>
     */
    public static List<Grid3> direcciones() {
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select id,nombre from direccion";

        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                System.out.print(rs.getInt(1));
                g.setNombre(rs.getString(2));
                System.out.println(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                conn.close();
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        return lista;
    }

    /**
     * Método que devuelve el nivel del usuario en base a su id de cedula
     *
     * @param ced id de la cedula
     * @return entero con el nivel de usuario, si cero entonces error
     */
    public static int nivelxced(int ced) {
        int total = 0;
        String sql = "select nivel from cedula a,usuarios b where a.id=? and a.usuario=b.id;";
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);
            pst.setInt(1, ced);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                total = rs.getInt(1);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        System.out.println("nivelxced: Nivel de cedula " + ced + " es: " + total);
        return total;
    }

    /**
     * Todas las cedulas existentes por toda la empresa.
     *
     * @return de tipo Grid con los datos de cedula.
     */
    public static List<Grid3> cedulasempresa() {
        // String[][] datos=new String[totalsubxpuestorev(puesto)+1][2];
        List<Grid3> lista = new ArrayList<Grid3>();
        String sql = "select b.id,c.nombre from cedula b,usuarios c where  c.id=b.usuario;";
        PreparedStatement pst = null;
        Connection conn = null;
        try {
            conn = p.extraerConexion();
            pst = conn.prepareStatement(sql);

            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                Grid3 g = new Grid3();
                g.setCedula(rs.getInt(1));
                // System.out.println(rs.getInt(1));
                g.setNombre(rs.getString(2));
                // System.out.println(rs.getString(2));
                lista.add(g);
            }
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pst.close();
                p.liberarConexion(conn);
                //System.gc();
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        }
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        System.out.println(gson.toJson(lista));
        return lista;
    }
    public static void main(String[] args) {
        //cedulasempresa();
        //objcedulacol(26,4,2014);
        //listacol(45, 4, 2013);
       // objcedulacolL(26,4,2014);
       // cedulatotal(18,26,45,5);
        objcedulamm(27,3,2014);
    }
}
